home *** CD-ROM | disk | FTP | other *** search
- {-----------------------------------------------------------------------------}
- { Dieses Modul enthält alle Routinen, die zur Darstellung des Achsenkreuzes }
- { und zum Zeichnen der Funktion nötig sind. }
- { }
- { (c) WURMSOFTWARE im Mai 1987 }
- {-----------------------------------------------------------------------------}
-
- {======================= Do_x_Koordinaten =================================}
-
- { Berechnung der Abbildungsfaktoren aus den eingegebenen Parametern }
-
-
- FUNCTION Do_x_Koordinaten (VAR draw : draw_type ;
- VAR fkt_wert : fkt_wert_type) : integer ;
-
- VAR flag : boolean ;
- i, fehler, zusatz : integer ;
-
- BEGIN
- fehler := 0 ;
-
- {-- Holen der aktuellen Werte --}
-
- flag := Zahl_Einlesen (werte_zei, zxmin, draw.x_min) ;
- flag := Zahl_Einlesen (werte_zei, zxmax, draw.x_max) ;
-
- {-- Auswerten der x_Werte --}
-
- IF draw.x_min >= draw.x_max THEN fehler := 1
- ELSE
- BEGIN {-- also bei gültigen x-Grenzen !! --}
-
- IF draw.x_log THEN {-- bei logarithmischer x-Einteilung --}
- BEGIN
- IF draw.x_min <= 0 THEN fehler := 2 {-- LOG-Einteilung > 0 --}
- ELSE
- BEGIN
- IF draw.x_min < 1 THEN zusatz := -1
- ELSE zusatz := 1 ;
- draw.max_pot_x := TRUNC (LOG (draw.x_max) + 0.1) ;
- draw.min_pot_x := TRUNC (LOG (draw.x_min) + zusatz) ;
-
- draw.x_max := NPwrOfTen (draw.max_pot_x + 1) ;
- draw.x_min := NPwrOfTen (draw.min_pot_x) ;
-
- draw.dx := 600 / ABS (LOG (draw.x_max) - LOG (draw.x_min)) ;
- draw.null_x := TRUNC (ABS (draw.min_pot_x * draw.dx)) ;
- END ;
- END
- ELSE
- BEGIN
- IF draw.x_min > 0 THEN draw.x_min := 0 ;
- draw.dx := 600 / ABS (draw.x_max - draw.x_min) ;
- draw.null_x := TRUNC (ABS (draw.x_min * draw.dx)) ;
- END ;
- END ;
- Do_x_Koordinaten := fehler ;
- END ;
-
-
- {======================= Do_y_Koordinaten =================================}
-
- { Berechnung der Abbildungsfaktoren aus den eingegebenen Parametern }
-
-
- FUNCTION Do_y_Koordinaten (VAR draw : draw_type ;
- VAR fkt_wert : fkt_wert_type) : integer ;
-
- VAR flag : boolean ;
- i, fehler, zusatz : integer ;
-
- BEGIN
- fehler := 0 ;
-
- {-- Holen der aktuellen Werte --}
-
- flag := Zahl_Einlesen (werte_zei, zymin, draw.y_min) ;
- flag := Zahl_Einlesen (werte_zei, zymax, draw.y_max) ;
-
- {-- Auswerten der y_Werte --}
-
- IF draw.y_min >= draw.y_max THEN fehler := 3
- ELSE
- BEGIN {-- also bei gültigen y-Grenzen !! --}
-
- IF draw.auto THEN {-- automatische y-Skalierung --}
- BEGIN
-
- IF draw.y_log THEN
- BEGIN
- IF fkt_wert[1] <= 0 THEN draw.y_min := 1
- ELSE draw.y_min := fkt_wert[1] ;
- END
- ELSE
- draw.y_min := fkt_wert[1] ;
-
- draw.y_max := fkt_wert[1] ;
- FOR i := 2 TO 600 DO
- BEGIN
-
- IF NOT draw.y_log THEN
- IF fkt_wert[i] < draw.y_min THEN draw.y_min := fkt_wert[i] ;
- IF draw.y_log THEN
- IF (fkt_wert[i] < draw.y_min) AND (fkt_wert[i] > 0) THEN
- draw.y_min := fkt_wert[i] ;
-
- IF fkt_wert[i] > draw.y_max THEN draw.y_max := fkt_wert[i] ;
- END ;
- draw.y_min := draw.y_min + 0.1 * draw.y_min ;
- draw.y_max := draw.y_max + 0.1 * draw.y_max ;
- END ;
-
- IF draw.y_log THEN {-- bei logarithmischer y-Einteilung --}
- BEGIN
- IF draw.y_min <= 0 THEN fehler := 4 {-- LOG-Einteilung > 0 --}
- ELSE
- BEGIN
- IF draw.y_min < 1 THEN zusatz := -1
- ELSE zusatz := 1 ;
- draw.max_pot_y := TRUNC (LOG (draw.y_max) + 0.1) ;
- draw.min_pot_y := TRUNC (LOG (draw.y_min) + zusatz) ;
-
- draw.y_max := NPwrOfTen (draw.max_pot_y + 1) ;
- draw.y_min := NPwrOfTen (draw.min_pot_y) ;
-
- draw.dy := 400 / ABS (LOG (draw.y_max) - LOG (draw.y_min)) ;
- draw.null_y := TRUNC (ABS (draw.min_pot_y * draw.dy)) ;
- END ;
- END
- ELSE
- BEGIN
- IF draw.y_min > 0 THEN draw.y_min := 0 ;
- draw.dy := 400 / ABS (draw.y_max - draw.y_min) ;
- draw.null_y := TRUNC (ABS (draw.y_min * draw.dy)) ;
- END ;
- END ;
- Do_y_Koordinaten := fehler ;
- END ;
-
-
- {====================== Do_Kreuz_Zeichnen ==================================}
-
- { Zeichnet das Koordinatenkreuz gem. Angaben des Users }
-
-
- FUNCTION Do_Kreuz_Zeichnen (VAR draw : draw_type) : integer ;
-
- VAR fehler : integer ;
- flag : boolean ;
-
- {----- Achse_lin_x : Zeichnet x-Achse (linear) ------------------------------}
-
- PROCEDURE Achse_lin_x ;
-
- VAR plot_x : integer ;
- strich : real ;
-
- BEGIN
- IF draw.achsen_art <> ohne THEN
- BEGIN
- IF (draw.x_max - draw.x_min) / draw.x_skala > 300 THEN fehler := 11
- ELSE
- BEGIN
- strich := TRUNC (draw.x_min / draw.x_skala) * draw.x_skala ;
- WHILE (strich <= draw.x_max) OR (plot_x + strich * draw.dx < 600) DO
- BEGIN
- plot_x := draw.null_x + TRUNC (strich * draw.dx) ;
- IF draw.achsen_art = netz THEN
- line (plot_x+20, 0, plot_x+20, 399, 1, 0, 0, 0, $8888, 1) ;
- line (plot_x+20, 399-draw.null_y-1, plot_x+20, 399-draw.null_y-4,
- 1, 0, 0, 0, -1,0) ;
- strich := strich + draw.x_skala ;
- END ;
- END ;
- END ;
- line (20, 399 - draw.null_y, 620, 399 - draw.null_y, 1, 0, 0, 0, -1, 0) ;
- END ;
-
-
- {----- Achse_lin_y : Zeichnet y-Achse (linear) ------------------------------}
-
- PROCEDURE Achse_lin_y ;
-
- VAR plot_y : integer ;
- strich : real ;
-
- BEGIN
- IF draw.achsen_art <> ohne THEN
- BEGIN
- IF (draw.y_max - draw.y_min) / draw.y_skala > 200 THEN fehler := 12
- ELSE
- BEGIN
- strich := TRUNC (draw.y_min / draw.y_skala) * draw.y_skala ;
- WHILE (strich <= draw.y_max) OR (plot_y + strich * draw.dy < 400) DO
- BEGIN
- plot_y := draw.null_y + TRUNC (strich * draw.dy) ;
- IF draw.achsen_art = netz THEN
- line (20, 399-plot_y, 620, 399-plot_y, 1, 0, 0, 0, $8888, 1) ;
- line (draw.null_x+21, 399-plot_y, draw.null_x+24, 399-plot_y,
- 1, 0, 0, 0, -1, 0) ;
- strich := strich + draw.y_skala ;
- END ;
- END ;
- END ;
- line (draw.null_x+20, 0, draw.null_x+20, 399, 1, 0, 0, 0, -1, 0) ;
- END ;
-
-
- {----- Achse_log_x : Zeichnet x-Achse (logarith.) ---------------------------}
-
- PROCEDURE Achse_log_x ;
-
- VAR i, j, plot_x : integer ;
- strich : real ;
-
- BEGIN
- FOR j := draw.min_pot_x TO draw.max_pot_x DO
- BEGIN
- FOR i := 1 TO 9 DO
- BEGIN
- strich := LOG (i * NPwrOfTen(j)) ;
- plot_x := draw.null_x + TRUNC (strich * draw.dx) ;
- IF draw.achsen_art = netz THEN
- line (plot_x+20, 0, plot_x+20, 399, 1, 0, 0, 0, $8888, 1) ;
- line (plot_x+20, 399-draw.null_y-1, plot_x+20, 399-draw.null_y-4,
- 1, 0, 0, 0, -1,0) ;
- END ;
- END ;
- line (20, 399 - draw.null_y, 620, 399 - draw.null_y, 1, 0, 0, 0, -1, 0) ;
- END ;
-
-
- {----- Achse_log_y : Zeichnet y-Achse (logarith.) ---------------------------}
-
- PROCEDURE Achse_log_y ;
-
- VAR i, j, plot_y : integer ;
- strich : real ;
-
- BEGIN
- FOR j := draw.min_pot_y TO draw.max_pot_y DO
- BEGIN
- FOR i := 1 TO 9 DO
- BEGIN
- strich := LOG (i * NPwrOfTen(j)) ;
- plot_y := draw.null_y + TRUNC (strich * draw.dy) ;
- IF draw.achsen_art = netz THEN
- line (20, 399 - plot_y, 620, 399 - plot_y, 1, 0, 0, 0, $8888, 1) ;
- line (draw.null_x+21, 399-plot_y, draw.null_x+24, 399-plot_y,
- 1, 0, 0, 0, -1, 0) ;
- END ;
- END ;
- line (draw.null_x+20, 0, draw.null_x+20, 399, 1, 0, 0, 0, -1, 0) ;
- END ;
-
-
- {---------------------------- Procedure selbst -------------------------------}
-
- BEGIN
- fehler := 0 ;
- flag := Zahl_Einlesen (werte_zei, wskalax, draw.x_skala) ;
- flag := Zahl_Einlesen (werte_zei, wskalay, draw.y_skala) ;
- IF (draw.x_skala = 0) OR (draw.y_skala = 0) THEN fehler := 13
- ELSE
- BEGIN
- IF draw.x_log THEN Achse_log_x
- ELSE Achse_lin_x ;
- IF draw.y_log THEN Achse_log_y
- ELSE Achse_lin_y ;
- END ;
- IF fehler <> 0 THEN button := Do_Alert (warn[fehler], 1) ;
- Do_Kreuz_Zeichnen := 0 ;
- END ;
-
-
- {==================== Do_Draw_Funktion =======================================}
-
- { Zeichnet die berechneten Funktionswerte in den Graphen ein }
-
-
- PROCEDURE Do_Draw_Funktion (VAR draw : draw_type ;
- VAR fkt_wert : fkt_wert_type ;
- error_feld : error_feld_type ;
- step : integer ) ;
-
- VAR i, plot_x, plot_y,
- help_x, help_y, fehler : integer ;
-
- BEGIN
- fehler := Do_Kreuz_Zeichnen (draw) ;
- IF fehler <> 0 THEN
- button := Do_Alert (warn[fehler], 1)
- ELSE
- BEGIN
- i := 1 ;
- WHILE i <= 600 DO
- BEGIN
- plot_x := i ;
- IF draw.y_log THEN
- BEGIN
- IF (fkt_wert[i] > 0) THEN
- BEGIN
- IF ((LOG(fkt_wert[i]) * draw.dy) + draw.null_y) < 400 THEN
- plot_y := TRUNC (LOG (fkt_wert[i]) * draw.dy) + draw.null_y
- ELSE
- plot_y := 399 ;
- END
- ELSE
- plot_y := 0 ;
- END
- ELSE
- BEGIN
- IF (draw.null_y + fkt_wert[i] * draw.dy) < 400 THEN
- plot_y := draw.null_y + TRUNC (fkt_wert[i] * draw.dy)
- ELSE
- plot_y := 399
- END ;
-
- IF plot_y < 0 THEN plot_y := 0 ;
-
- IF (i > step) THEN
- BEGIN
- IF (error_feld[i] = 0) AND (error_feld[i-step] = 0) AND draw.verb THEN
- line (help_x + 20, 399 - help_y, plot_x + 20, 399 - plot_y,
- 1, 0, 0, 0, -1, 0)
- ELSE
- line (plot_x + 20, 399 - plot_y, plot_x + 20, 399 - plot_y,
- 1, 0, 0, 0, -1, 0)
- END
- ELSE
- line (plot_x + 20, 399 - plot_y, plot_x + 20, 399 - plot_y,
- 1, 0, 0, 0, -1, 0) ;
-
- help_x := plot_x ; help_y := plot_y ;
- i := i + step ;
- END ;
- END ;
- Do_Merken ;
- END ;
-
-
-